u32 test = 1;
if (*((u8 *)&test) == 1)
{
- printk("ACM module running in LITTLE ENDIAN.\n");
+ printkd("ACM module running in LITTLE ENDIAN.\n");
little_endian = 1;
}
else
{
- printk("ACM module running in BIG ENDIAN.\n");
+ printkd("ACM module running in BIG ENDIAN.\n");
little_endian = 0;
}
}
+int
+acm_set_policy_reference(u8 * buf, u32 buf_size)
+{
+ struct acm_policy_reference_buffer *pr = (struct acm_policy_reference_buffer *)buf;
+ acm_bin_pol.policy_reference_name = (char *)xmalloc_array(u8, ntohl(pr->len));
+
+ if (!acm_bin_pol.policy_reference_name)
+ return -ENOMEM;
+
+ strcpy(acm_bin_pol.policy_reference_name, (char *)(buf + sizeof(struct acm_policy_reference_buffer)));
+ printk("%s: Activating policy %s\n", __func__, acm_bin_pol.policy_reference_name);
+ return 0;
+}
+
+int
+acm_dump_policy_reference(u8 *buf, u32 buf_size)
+{
+ struct acm_policy_reference_buffer *pr_buf = (struct acm_policy_reference_buffer *)buf;
+ int ret = sizeof(struct acm_policy_reference_buffer) + strlen(acm_bin_pol.policy_reference_name) + 1;
+
+ if (buf_size < ret)
+ return -EINVAL;
+
+ pr_buf->len = htonl(strlen(acm_bin_pol.policy_reference_name) + 1); /* including stringend '\0' */
+ strcpy((char *)(buf + sizeof(struct acm_policy_reference_buffer)),
+ acm_bin_pol.policy_reference_name);
+ return ret;
+}
+
int
acm_init_binary_policy(u32 policy_code)
{
0);
if (rc == ACM_OK)
{
- printf("Policy len 0x%lx, start at %p.\n",_policy_len,_policy_start);
+ printkd("Policy len 0x%lx, start at %p.\n",_policy_len,_policy_start);
if (i == 1)
{
if (mbi->mods_count > 2)
else
{
printk("Invalid policy. %d.th module line.\n", i+1);
+ /* load default policy later */
+ acm_active_security_policy = ACM_POLICY_UNDEFINED;
}
} /* end if a binary policy definition, i.e., (ntohl(pol->magic) == ACM_MAGIC ) */
}
if (acm_active_security_policy != ACM_POLICY_UNDEFINED)
{
- printk("%s: Boot-Policy. Enforcing %s: Primary %s, Secondary %s.\n", __func__,
- ACM_POLICY_NAME(acm_active_security_policy),
- ACM_POLICY_NAME(acm_bin_pol.primary_policy_code),
- ACM_POLICY_NAME(acm_bin_pol.secondary_policy_code));
+ printk("%s: Enforcing %s boot policy.\n", __func__,
+ ACM_POLICY_NAME(acm_active_security_policy));
goto out;
}
/* else continue with the minimal hardcoded default startup policy */
goto out;
}
acm_active_security_policy = ACM_DEFAULT_SECURITY_POLICY;
+ if (acm_active_security_policy != ACM_NULL_POLICY)
+ acm_bin_pol.policy_reference_name = "DEFAULT";
+ else
+ acm_bin_pol.policy_reference_name = "NULL";
out:
if (ret != ACM_OK)
put_domain(subj);
return ACM_INIT_SSID_ERROR;
}
- printk("%s: assigned domain %x the ssidref=%x.\n",
+ printkd("%s: assigned domain %x the ssidref=%x.\n",
__func__, id, ssid->ssidref);
put_domain(subj);
return ACM_OK;
/* get bin_policy lock and rewrite policy (release old one) */
write_lock(&acm_bin_pol_rwlock);
- /* 3. set primary policy data */
+ /* 3. set label reference name */
+ if (acm_set_policy_reference(buf + ntohl(pol->policy_reference_offset),
+ ntohl(pol->primary_buffer_offset) -
+ ntohl(pol->policy_reference_offset)))
+ goto error_lock_free;
+
+ /* 4. set primary policy data */
if (acm_primary_ops->set_binary_policy(buf + ntohl(pol->primary_buffer_offset),
ntohl(pol->secondary_buffer_offset) -
ntohl(pol->primary_buffer_offset)))
goto error_lock_free;
- /* 4. set secondary policy data */
+ /* 5. set secondary policy data */
if (acm_secondary_ops->set_binary_policy(buf + ntohl(pol->secondary_buffer_offset),
ntohl(pol->len) -
ntohl(pol->secondary_buffer_offset)))
bin_pol->secondary_policy_code = htonl(acm_bin_pol.secondary_policy_code);
bin_pol->len = htonl(sizeof(struct acm_policy_buffer));
+ bin_pol->policy_reference_offset = htonl(ntohl(bin_pol->len));
bin_pol->primary_buffer_offset = htonl(ntohl(bin_pol->len));
bin_pol->secondary_buffer_offset = htonl(ntohl(bin_pol->len));
+ ret = acm_dump_policy_reference(policy_buffer + ntohl(bin_pol->policy_reference_offset),
+ buf_size - ntohl(bin_pol->policy_reference_offset));
+ if (ret < 0)
+ goto error_free_unlock;
+
+ bin_pol->len = htonl(ntohl(bin_pol->len) + ret);
+ bin_pol->primary_buffer_offset = htonl(ntohl(bin_pol->len));
+
ret = acm_primary_ops->dump_binary_policy (policy_buffer + ntohl(bin_pol->primary_buffer_offset),
buf_size - ntohl(bin_pol->primary_buffer_offset));
if (ret < 0)
acm_ssid->ssidref = ssidref;
acm_ssid->primary_policy_code = acm_bin_pol.primary_policy_code;
acm_ssid->secondary_policy_code = acm_bin_pol.secondary_policy_code;
+
+ acm_ssid->policy_reference_offset = acm_ssid->len;
+ ret = acm_dump_policy_reference(ssid_buffer + acm_ssid->policy_reference_offset,
+ buf_size - acm_ssid->policy_reference_offset);
+ if (ret < 0)
+ goto error_free_unlock;
+
+ acm_ssid->len += ret;
acm_ssid->primary_types_offset = acm_ssid->len;
/* ret >= 0 --> ret == max_types */
/* Xen-internal representation of the binary policy */
struct acm_binary_policy {
+ char *policy_reference_name;
u16 primary_policy_code;
u16 secondary_policy_code;
};
int acm_dump_statistics(void *buf, u16 buf_size);
int acm_get_ssid(ssidref_t ssidref, u8 *buf, u16 buf_size);
int acm_get_decision(ssidref_t ssidref1, ssidref_t ssidref2, enum acm_hook_type hook);
-
+int acm_set_policy_reference(u8 * buf, u32 buf_size);
+int acm_dump_policy_reference(u8 *buf, u32 buf_size);
#endif
/*
/* policy: */
#define ACM_POLICY_NAME(X) \
- ((X) == (ACM_NULL_POLICY)) ? "NULL policy" : \
- ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL policy" : \
- ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT policy" : \
- ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT policy" : \
- "UNDEFINED policy"
+ ((X) == (ACM_NULL_POLICY)) ? "NULL" : \
+ ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" : \
+ ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \
+ ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \
+ "UNDEFINED"
/* the following policy versions must be increased
* whenever the interpretation of the related
* policy's data structure changes
*/
-#define ACM_POLICY_VERSION 1
+#define ACM_POLICY_VERSION 2
#define ACM_CHWALL_VERSION 1
#define ACM_STE_VERSION 1
uint32_t policy_version; /* ACM_POLICY_VERSION */
uint32_t magic;
uint32_t len;
+ uint32_t policy_reference_offset;
uint32_t primary_policy_code;
uint32_t primary_buffer_offset;
uint32_t secondary_policy_code;
uint32_t secondary_buffer_offset;
};
+struct acm_policy_reference_buffer {
+ uint32_t len;
+};
+
struct acm_chwall_policy_buffer {
uint32_t policy_version; /* ACM_CHWALL_VERSION */
uint32_t policy_code;
struct acm_ssid_buffer {
uint32_t len;
ssidref_t ssidref;
+ uint32_t policy_reference_offset;
uint32_t primary_policy_code;
uint32_t primary_max_types;
uint32_t primary_types_offset;
* This makes sure that old versions of acm tools will stop working in a
* well-defined way (rather than crashing the machine, for instance).
*/
-#define ACM_INTERFACE_VERSION 0xAAAA0005
+#define ACM_INTERFACE_VERSION 0xAAAA0006
/************************************************************************/